//
//  LiveAPI.swift
//  GLUZSwift
//
//  Created by yu on 2025/3/24.
//  Copyright © 2025 考拉🐨. All rights reserved.
//

import Foundation
import Moya

enum LiveAPI {
    
    /// 创建/加入直播
    /// - Parameters:
    ///   - exhibitionId: 展会 id
    ///   - userId: 用户 id
    ///   - roomId: 直播间 id
    case startLive(exhibitionId: Int, userId: String, roomId: String)
    /// 查询主播是否开启直播
    case checkIsLiving(userId: String)
    
    /// IM 扣除积分
    /// - Parameters:
    ///   - from: 发送人的 id
    ///   - to: 接收人的 id
    case imScore(from: String, to: String)
    /// IM 扣费状态检查
    /// - Parameters:
    ///   - from: 发送人的 id
    ///   - to: 接收人的 id
    case imCheck(from: String, to: String)
    
    
    /// 同声传译,实时翻译 弹框显示内容
    case systemMsg
    
    /// 是否可以接听电话
    case isCanReceiveCall
    
    // 占位
    case placeholderApi
}

extension LiveAPI: TargetType {
    // 请求地址
    var baseURL: URL {
        
        switch self {
        case .imScore, .imCheck, .systemMsg, .isCanReceiveCall:
            return URL(string: SystemEnvManager.shared.phpUrl)!
        default:
            break
        }
        
        return URL(string: SystemEnvManager.shared.javaUrl)!
    }
    
    // 请求API
    var path: String {
        switch self {
            // 开始直播
        case .startLive: return "/faLive/startLive"
            // 是否正在直播
        case .checkIsLiving: return "/faLive/isOnLive"
            
        case .imScore: return "/api/user/deduct_score"
        case .imCheck: return "/api/user/chechkIm"
        case .systemMsg: return "/api/demo/system_msg"
        case .isCanReceiveCall: return "/api/demo/system_msg"
            
        default:
            fatalError("Request path is null")
        }
    }
    
    // 请求方式: post/get
    var method: Moya.Method {
        switch self {
        case .startLive, .checkIsLiving:
            return .get
            
        default: // 默认post请求
            return .post
        }
    }
    
    // 公共头部信息
    var headers: [String: String]? {
        var headers: [String: String] = [:]
        headers["token"] = UserProfile.token
        headers["client"] = "app"
        headers["Content-type"] = "application/json;charset=utf-8"
        headers["requestStartTime"] = String(CFAbsoluteTimeGetCurrent())
        return headers
    }
    
    // 请求任务
    var task: Moya.Task {
        // 公共参数
        var params: [String: Any] = [:]
        switch self {
        case .startLive(let exhibitionId, let userId, let roomId):
            params["exhibitionId"]  = exhibitionId
            params["userId"] = userId
            params["roomId"] = roomId
            
        case .checkIsLiving(let userId):
            params["userId"] = userId
            
        case .imScore(let from, let to):
            params["send_uid"] = from
            params["receive_uid"] = to
            
        case .imCheck(let from, let to):
            params["send_uid"] = from
            params["receive_uid"] = to
            
            
        default:
            break
        }
        
        // 设置请求类型, 比如没有参数的请求、有参数的请求、上传文件、下载文件
        switch self {
        case .systemMsg:
            // 没有请求参数的请求。
            return .requestPlain
            
        default:
            // 默认有请求参数
            if method == .get {
                // 在发起GET请求时，确保使用 URLEncoding.default 编码方式，这样参数会被正确添加到URL的查询字符串中，而不是作为请求体发送。
                return .requestParameters(parameters: params, encoding: URLEncoding.default)
            } else {
                return .requestParameters(parameters: params, encoding: JSONEncoding.default)
            }
        }
    }
    
    // 通过statuscode过滤返回内容
    public var validationType: ValidationType {
        switch self {
        default:
            return .none
        }
    }
    
    
    // 多用于单元测试,这个属性是返回Stub数据的。
    public var sampleData: Data {
        switch self {
        default:
            return "".data(using: .utf8)!
        }
    }
    
}
